import { Plugin, ResolvedConfig } from 'vite';
import fg from 'fast-glob';
import { createPreloadScript } from './preload.ts';
interface PreloadImagePluginOptions {
    bundleDir?: string; //会被 vite 处理的图片路径
    publicDir?: string; //不会被 vite 处理的图片路径
    //是否自动预加载图片
    autoPreload?: boolean;
    idleTimeout?: number; // 网络空闲时的超时时间
}
function preloadImagePlugin(options: PreloadImagePluginOptions): Plugin {
    let { bundleDir = "", publicDir = "", idleTimeout = 500, autoPreload = false } = options;
    const imageNameMap = new Map(); // 用于存储图片vite处理前后的映射关系
    // 获取 bundleDir 下的所有文件
    let bundleFiles = fg.sync(bundleDir, {
        onlyFiles: true, // 只匹配文件，不匹配目录
    })
    // vite 构建配置
    let viteConfig: ResolvedConfig

    return {
        name: 'vite-plugin-preload-image',
        configResolved(config) {
            // 保存 vite 配置
            viteConfig = config
        },
        transformIndexHtml(html) {
            // 获取 publicDir 下的所有文件
            let publicFiles = fg.sync(publicDir, {
                cwd: viteConfig.publicDir,
                onlyFiles: true, // 只匹配文件，不匹配目录
            })


            // 生成 preload 链接
            let preloadUrls = [
                ...publicFiles.map(src => `${viteConfig.base}${src}`),
                ...bundleFiles.map(src => `${viteConfig.base}${imageNameMap.get(src) || src}`)
            ];
            console.log(preloadUrls);
            // 在head标签中插入preload链接
            return html
                .replace(
                    '</head>',
                    `${createPreloadScript(preloadUrls, idleTimeout, autoPreload)}\n</head>`
                );
        },
        // 构建模式下的 hook
        generateBundle(_, bundle) {
            Object.values(bundle).forEach((file) => {
                if (file.type === 'asset' && file.fileName) {
                    if (bundleFiles.includes(file.originalFileNames[0])) imageNameMap.set(file.originalFileNames[0], file.fileName);
                }
            });
        },
    };
}

export default preloadImagePlugin;